// Classe Connection au serveur
function Connection()
{	
	// CONSTANTES
	IP_SERVEUR = $('#ip_serveur').val();
	PORT_SERVEUR = $('#port_serveur').val();
	//IP_SERVEUR = "127.0.0.1"
	//PORT_SERVEUR = 4567;
	
	// ATTRIBUT
	this.idUser;		//Id Utilisateur
	this.socket;		//Web Socket
	this.socketOuverte;	//Booleen
	this.mapCalques;		//Map des calques connecté (pour les notifier)
	
	//Constructeur
	this.initialize = function (_idUser){
		
		this.idUser = _idUser;
		this.socketOuverte = false;
		this.mapCalques = new Object();
		
		var adresse = 'ws://'+ IP_SERVEUR +':'+ PORT_SERVEUR;
		console.log(adresse);
		this.socket = new WebSocket(adresse);

		var self = this;
		console.log("Ouverture Socket ...");
		//Ouverture de la socket
		this.socket.onopen = function() {
			console.log("Socket OK ... "); 
			self.socketOuverte = true;
			self.commandeID();
			$(document).trigger("SOCKETOK");
		};
		
		//Reception d'un message
		this.socket.onmessage = function(msg){
			var data = "";     
			try { //tente de parser data
				data = JSON.parse(msg.data);
			} catch(exception) {
				data = msg.data;
			}
			self.traiterCommande(data.toString());      
		};
        
        //Fermeture du la socket
        this.socket.onclose = function(){
        	self.socketOuverte = false;	
        };
        
	};
	
	//Envoyer une commande
	this.envoyerCommande = function(_commande){
		if (this.socketOuverte){
			console.log(" --> " + _commande);
			this.socket.send(_commande);}	
	};
	
	//Traiter une commande reçu
	this.traiterCommande = function(_commande){
		console.log(" <-- " + _commande);
		var elem = _commande.split(" ");
		var nomCommande = elem[0];
		switch(nomCommande){
			case "/UPDATE":
				this.traiterCommandeUPDATE(elem[1]);
				break;
			default:
				this.traiterRetour(elem[0]);
				break;
		}	
	};
	
	//Fermeture
	this.quitter = function(){
		this.envoyerCommande("/QUIT");
	};
	
	//Enregistrement d'un calque
	this.connexionCalque = function(_calque){
		this.mapCalques[_calque.IdCalque] = _calque;
		this.commandeDEPENDANCE([_calque.IdCalque]);
	};
	
	//COMMANDE ID
	this.commandeID = function(){
		this.envoyerCommande("/ID " + this.idUser);
	};
	
	//COMMANDE DEPENDANCE (_tabIdCalques : tableau contenant les ID des calques)
	this.commandeDEPENDANCE = function(_tabIdCalques){
		var stringIDs = "";
		for (var i = 0; i < _tabIdCalques.length; i++)
		{
			stringIDs += _tabIdCalques[i];
			if (i < ( _tabIdCalques.length - 1 )) stringIDs += ";";
		}
		
		this.envoyerCommande("/DEPENDANCES " + stringIDs);
	};
	
	//COMMANDE ANNOTATION
	this.commandeANNOTATION = function(_IdCalque){
		this.envoyerCommande("/ANNOTATION " + _IdCalque);
	};
	
	//Traitement des Retours du serveur
	this.traiterRetour = function(_CodeRetour){
		switch(_CodeRetour){
			case "200":
				console.log("ID OK");
				break;
			case "210":
				console.log("DEPENDANCE OK");
				break;		
			case "220":
				console.log("ANNOTATION OK");
				break;	
			case "000":
				console.log("Code 0");
				break;
			default:
				console.log("Retour non reconnu : " + _CodeRetour);
				break;
		};	
	};
	
	//Traitement de la commande update
	this.traiterCommandeUPDATE = function(_IdCalque){
		this.mapCalques[_IdCalque].update();
		console.log("traitement Update ..." + _IdCalque);
	};
};
